import { int, sqliteTable, text, blob, customType } from "drizzle-orm/sqlite-core";

interface UnitsGroup {
  // 分组名字
  t: string,
  // 列表
  list: string[]
}

// 自定义序列化逻辑
const jsonColumn = <T>() =>
  customType<{ data: T; driverData: string }>({
    dataType() {
      return 'text'; // 数据库中的存储类型
    },
    fromDriver(value: string): T  {
      if(!value) {
        return null as any
      }
      return JSON.parse(value || ''); // 从数据库读取时反序列化
    },
    toDriver(value: T): string {
      return JSON.stringify(value); // 写入数据库时序列化
    },
  });

export const books = sqliteTable("books", {
  id: text().primaryKey(),

  // 书籍名称
  name: text(),

  // 排序
  order: int(),

  // 分类id
  category_id: int(),

  // 单词数量
  w_count: int(),

  // 等级
  level_id: int(),

  // 归属方
  author: text(),

  // 出版人
  publisher: text(),

  // 描述
  comment: text(),

  // 单词
  units: jsonColumn<UnitsGroup[]>()('units'), // 使用通用方法
});

export const Books = books.$inferInsert

export const dict = sqliteTable("dict", {
  id: int().primaryKey({ autoIncrement: true }),

  // 类型
  type: text(),

  // 名字
  name: text(),

  // 值
  value: text(),
});

export const Dict = dict.$inferInsert



export const word = sqliteTable("words", {
  id: int().primaryKey(),

  // 单词
  name: text().unique(),

  // 美式发音
  us: text(),

  // 英式发音
  uk: text(),

  // 翻译
  translation: jsonColumn<string[]>()('translation'),

  // 单词的词形变化（如不规则动词的变化形式）
  exchange: jsonColumn<string[]>()('exchange'),

  // 包含该单词的短句
  phrases: jsonColumn<{
    // 英文
    phrases: string,

    // 意义
    meanings: string[]
  }[]>()('phrases'),

  // 该单词的故事
  story: text(),

  // 单词速度记
  shortAssist: text(),

  // 单词例句
  sentences: jsonColumn<{
    // 英文
    sentence: string,

    // 翻译
    translation: string,

    // 音频
    audio: string,
  }[]>()('sentences'),

  // 音频
  audio: text(),

  // 单词分割
  w_split_time: jsonColumn<{
    // key 分割的字母
    [key: string]: {
      // 音标
      phonetic: string,
      // 语音出现时间
      time: string[]
    }
  }[]>()('w_split_time'),

  // 分割后完整音频
  w_split_audio: text(),

  // 词根解释
  stem_afix: jsonColumn<{ 
    stem: { 
      origin: string, 
      explain: string, 
      detail: string, 
      thumbnail: string, 
      imageurl: string 
    }, 
    prefix: { 
      explain: string, 
      detail: string, 
      origin: string, 
      imageurl: string
    }, 
    suffix: { 
      explain: string, 
      detail: string, 
      origin: string, 
      imageurl: string 
    }, 
    explain: string 
  } | null>()('stem_afix'),

});

export const Word = word.$inferInsert